大模型时代的钥匙,Prompt 完全食用指南

2023 年是 AI 的时代,以 ChatGPT 为首的大模型召唤出了一大批炼金术士,他们挥舞着魔杖,以自己的智慧、灵感和激情不停地创造着一个又一个绚丽的世界。而 Prompt,就是这个 AI 时代的炼金咒语。

“假如你是莎士比亚,请帮我写一首 100 字左右的情诗,献给我心爱的姑娘”,当一位初生的炼金术士对着这个时代最强大的炼金模型念诵着他的咒语,模型慷慨地回应了他的所求:

“我最亲爱的,我心目中的美丽少女。你是太阳,照耀着我的世界。你的美丽胜过最亮的星,在你面前,我所有的烦恼都远去。你是我花园里盛开的玫瑰,最甜美的香气使我的灵魂变得坚硬。你的声音是我耳边的音乐,在你的怀抱中,我忘记了所有的恐惧。

如斯美言,让这位不善倾吐的炼金术士,有了一展爱意的可能性。

然而,正如古老的炼金之神所传下的箴预:炼金乃一门艺术,而非科学。咒语时而能达成炼金者的心意,时而又如充耳的聋子或叛逆的顽童,唯一所长即是同炼金者作对,以不达心意为最大之己任。

所幸,炼金界的前辈们已总结了咒语的最佳实践,虽不能在所有实践场景下奏效,但已是金玉良言,足以为吾等初学者铺路。

一、大模型的工作原理

咒语,本质上是控制大模型的一把钥匙。若想学好咒语,需先学一学大模型的皮毛。大模型的本质,是基于大样本训练出的预测模型。模型基于给它输入的语料,根据概率预测可能的回答。模型的预测结果,受它的语料限制。譬如,模型所接收的语料是如下内容:

当提问者提问模型「中国的首都是哪里?」,模型的回答可能是「法国的首都是哪里?」。**模型实际上并不理解提问的含义,它只是根据过往的训练,预测与该提问最相关的内容 **。

为了避免这种情况的出现,在预测模型之上,早期的炼金术士们想出了一种方案:通过人类的反馈来约束模型,从而让模型回答出人类满意的答案。当预测模型执行某个任务时,人类可以提供正面或负面的反馈,以指导模型的行为。

通过这样的方式,当提问者再次提问「中国的首都是哪里?」时,模型就可以回答出人类想要的答案:「北京」。

(炼金小密闻:模型学习文本的方式同人类不同,它们会同时查看所有的内容,而不是像人类一样从左到右阅读。它们输出的每个字符都基于它们以前看到的和写下的,每次它们输出一个新字符时,都会停下来思考下一个字符是什么。另外,模型定义的字符和人类的定义也不一样,有时人类以为是一个字符的存在,在模型眼中可能是两个字符。)

二、大模型的能力

斯温伯恩曾言:“简单是真理的明证”,大模型也同样如此。作为炼金史上最强大的产物之一,它的能力也可以简单归为三类:识别、理解、生成。

识别:查找,并从语料中提取特定的信息

理解(并非人类意义上的理解):对语料加以解释、概括和推理;

生成:基于识别和理解之上,生成新的语料;

三生万物,杰出的炼金术士基于大模型的三种能力,与特定的行业结合,迸发出强大的创新和生产力。

信息筛选器

请基于我提供的文本,分析文本的内容,如果文本主题与 AI 伦理相关,请为我保留下来,并输出 100 字左右的简单概述。我希望你能将所有保留的文本梳理成一篇简报,并基于保留的文本输出 200 字左右的综述。

个性化客服

请阅读我所提供的客户评论,并分析用户的情感倾向。你将基于用户的情感倾向回复用户评论。如果用户评论为正向,请向用户表示感谢,字数为 50 字左右。如果用户评论为负向,请向用户致以诚挚的歉意,并表明我们的改进诚意,字数为 100 - 150 左右。你应该在回复中引用用户的原文。

代码生成器

假设你是一个 python 代码生成器,你的任务是基于用户所给的代码注释,生成对应的 python 代码,你应该以 markdown 的格式输出你的内容。在生成过程中,你应该检查用户的输入信息,以确保该信息足以让你输出正确的答案。若你在生成过程中有任何不确定的地方,请立即停止你的输出,并告知用户。

三、编写咒语的原则

杰出的炼金术士总是知道如何编写好的咒语以充分发挥大模型的能力,而他们也总是告诫初出茅庐的菜鸟们:编写咒语是一种艺术而非科学,因此需要反复实践,在挫败中总结。切勿迷信一成不变的最佳模板,每一个发挥良好功效的咒语都有它的适用场景和局限。

当然,一些良好且共通的实践规范仍然可以被分享,这是一条初生的道路,需要所有实践者的共同贡献。

编写有效咒语的良好实践准则:明确且具体的指令。

初生炼金术士在编写咒语,很容易在咒语中泛泛而谈。「请为我生成一首情诗」,既不知情诗的风格,也不知情诗的字数。相较而言,「请为我生成一首 100 字左右的莎士比亚风格的情诗」则具体许多。

在具体实践时,炼金术士们应该从输入思考输出三个维度思考咒语的编写,在每个维度都紧扣「明确且具体」的要求。

(一)输入维度

输入:指 prompt 的输入格式。一个良好 prompt 的输入格式应该是层次分明的,不同的内容类型最好以分隔符区分,譬如:

请将下列括号中的内容翻译成英文:(这是一个美好的时代,我们都有美好的未来。我们唯一要做的是耐心等待。)

通过括号的分割,prompt 的指令与文本被分开了,这使得咒语被模型识别时,不同的内容以不同的功能被执行。分隔符可以是任意类型,核心在于将不同的内容类型进行区分。

(二)思考维度

思考:指要求模型执行指令时的思维方式。正如人类有系统一和系统二一样,模型在执行时似乎也遵循着同样的逻辑。因此,当我们输入某些复杂问题时,模型为了效率优先,常常输出一些貌似正确,实则荒唐的答案。为了避免类似情况的出现,炼金术士在编写咒语时可以要求模型按特定的方式进行思考。

有两种方式可以「框定」模型的思考逻辑,一种是案例法,一种是框架法

(1)案例法

案例法:在要求模型输出特定的结果前,可以给模型少许样本参考,让它学习其中的模式。例:

Q:3 + 4 = ?
A:7
Q:3 + a = ?
A:unknown
Q:4 + b = ?
A:

模型通过用户提供的样本,识别了其中的模式,最终回答为 unknown。

(2)框架法

框架法:案例法相当于经验材料,让模型从中提取思维模式。我们也可以直接要求模型模型按照某些特定的思考模式进行思考。譬如:我们可以要求模型按我们指定的步骤进行思考,对于一些鼎鼎大名的逻辑(譬如贝叶斯),我们也可以直接要求模型按照该思维模型进行思考。

prompt: 假如你是天气预测器,最近 7 天都没有下雨,请思考明天下雨的概率
output:作为 AI 语言模型,我没有能力进行天气预测,但是从概率角度来看,如果最近 7 天都没有下雨,那么明天下雨的概率应该是比较低的,因为天气预测是基于历史数据和气象学知识进行预测的,而历史数据中连续多天都没有下雨的情况比较少见,因此明天下雨的概率应该是比较小的。但是天气变化是不确定的,也有可能出现突发情况导致明天下雨,因此不能完全排除下雨的可能性。

这是一位初生炼金士的咒语,该咒语中没有约束模型的思考方式,输出的结果则略显空泛。现在将咒语修改,增加对思维方式的约束:

prompt: 假如你是天气预测器,最近 7 天都没有下雨,请根据贝叶斯定理思考明天下雨的概率
output:

作为 AI 语言模型,我并不具备实时天气预测的能力,但我可以根据贝叶斯定理给出一个思考过程。

根据贝叶斯定理,我们可以通过已知的先验概率和新的证据来更新我们的后验概率。在这个问题中,我们可以将先验概率定义为在这个地区下雨的概率,而新的证据是最近 7 天都没有下雨。

假设在这个地区下雨的概率为 P(R),那么没有下雨的概率为 P(¬R) = 1 - P(R)。根据贝叶斯定理,我们可以得到:

P(R|¬R) = P(¬R|R) * P(R) / P(¬R)

其中,P(R|¬R) 表示在没有下雨的情况下,明天下雨的概率;P(¬R|R) 表示在下雨的情况下,明天不下雨的概率;P(R) 表示先验概率,即在这个地区下雨的概率;P(¬R) 表示没有下雨的概率。

由于最近 7 天都没有下雨,我们可以将 P(¬R|R) 设为一个较小的值,比如 0.1。而 P(R) 则需要根据实际情况来估计。如果这个地区经常下雨,那么 P(R) 可能会比较高;如果这个地区很少下雨,那么 P(R) 可能会比较低。

假设我们估计 P(R) 为 0.3,那么可以得到:

P(R|¬R) = 0.1 * 0.3 / (1 - 0.3) = 0.043

也就是说,在没有下雨的情况下,明天下雨的概率只有 4.3%。但需要注意的是,这个结果只是一个估计值,实际情况可能会有所不同。

相较于未约束的输出结果,约束后的模型的输出结果则更具体,也更具说服力。

在框架法中,有两种被推荐的实践方法,分别是一致性与 ReAct 模型:

(3)异常机制处理

马尔库塞说,人类是单向度的生物。此话也可以套用在思考上。无论是人类还是大模型,在思考上往往只考虑如果达成某项任务,而忽略了如果达不成某项任务,该如何处理。

富有经验的炼金士门在调教模型时,总是会在 prompt 中作如下约束:

  1. 要求模型检查用户所提供的信息,以确保信息的完善性足以保证任务的完成;
  2. 当模型运行时,若遭遇异常机制(如无法处理当前问题),应暂停回复生成的过程,及时报错;

(三)输出维度

咒语的输出维度包含两种要求:内容要求和格式要求:

四、良好咒语的格式

根据编写咒语的原则,炼金术士们总结了一套 prompt 的基本格式:

  1. 指令:要求模型对文本的处理动作;
  2. 指令的对象:需要模型处理的文本;
  3. 示例:案例或思维模型提示;
  4. 输出要求:对于输出内容的内容和格式要求
  5. 异常情况:对于模型无法执行,或指令信息缺失时的异常处理机制;

五、魔法时刻

炼金术是一种魔法,而魔法总有难以解释之处。以下是炼金术士们在经验中总结的魔法诀窍,除了遵循正统的咒语编写原则和格式外,应用这些魔法诀窍也能在实践中获得更好的咒术效果。

  1. 给模型起一个名字;
  2. 让它扮演某种角色;
  3. 赋予它某种任务;
  4. 在赋予任务时,使用「你应该…」而不是「禁止你…」的句式;
  5. 赋予任务后,要让模型确认你的要求;
  6. 当模型确认完(以及每次回复)你的指令时,给它一个鼓励;
  7. 请在 prompt 的开头和结尾都重复下你的指令;
  8. 如果你不想在 prompt 中输入示例,请在 prompt 的结尾加入如下的魔法咒语:「让我们一步步思考,以确保得出正确的答案」;

六、大模型的局限

任何一件伟大事物都有它的阿喀琉斯之踵,我们无法要求伟大事物做它能力边界之外的事情。正如前述指出的,大模型本质上是一种预测模型,它是披着语言之神外衣的概率之神所伪装,本质上只擅长三件事:识别、理解和生成。

所以,不要让它计算数学。尽管它通过了诸多考试,然而你绝不想考验它在关键时刻的准确性。曾经有炼金术士以小学的数学题让它思考,尽管它的分析过程并无谬误,但计算结果却堪称灾难。

问题:建筑工地有一批砖,最上层两块砖,第2层6块砖,第3层10块砖……,依次每层比其上一层多4块,已知最下层有2106块砖,这堆砖共有多少块? 

另外,大模型在某种意义上是一个记忆不佳的吹牛者。实际上,模型没有完全记住它所看到的信息,但它又想在提问者面前逞能,于是经常编造一些不存在的记忆。大模型自身无法规避这种行为的出现,炼金术士在编写咒语时,应鼓励大模型承认自己的无知,敢于将「不知道」宣之于口。同时,咒语中也应该要求大模型在列出事实性的信息时,注明来源和对应可核查的地址(尽管它连信息源都会伪造,但提供了一种核查的路径)。

除了这两个严重的缺陷外,炼金术们还发现了顺序对于大模型的影响,有时,示例顺序的不同,也会影响大模型的结果输出。对于这类情况,尚没有好的解决方案,只能调整语料顺序以找到最佳的输出结果。

七、真正重要的

如果让杰出的炼金术士留下他们最宝贵的箴言,那么一定是:没有什么是重要的,除了在实践中反思并重新迭代自己的咒语。即使是再杰出的炼金术士们,编写一条可用的咒语也至少需要三到四次的迭代,那些只编写了一次就开始抱怨大模型不起作用的炼金术士们,正缺乏这条箴言的鞭笞。

学习、运用、反思、迭代,正是这样循环往复的过程,才使得咒语的效力被真正发挥出来。挥动语言的炼金术士们,无人能够夺走他们对魔法的幻想和憧憬。

补充:claude 的 tips

一些使用 Claude 的注意事项:

  1. Claude 对 XML 格式做过预训练,所以可以把自己的文本放在 中,让 Claude 把回复放在 中;

  2. 在添加示例时也使用 ,且要区分 Human 和 Assistant 的角色;采用 H: 和 A: ;

  3. 如果 Claude 始终输出错误的信息,可以在最初的提示中描述此问题,并告知 Claude 该怎么做;

  4. 使用训练集和验证集来验证 prompt 的有效性,可以准备多组材料,划分训练集和数据集,让 Claude 输出结果;

  5. 把 Claude 输出的结果再作为信息传递给 Claude,让 Claude 自我核查它所得出的信息是否正确;如:让 Claude 检查语法错误,将结果也加入 prompt 中,询问 Claude 上述文本是否存在 xx 的语法错误;

  6. 要给出 Claude 在无法完成任务时的明确指令,以防止其出现幻觉乱编答案;最简单的是让它直接说不知道;

  7. 给 Claude 充分地思考时间,简言之,给出一个相对明确的思考步骤或者明确告诉它充分地了解相关背景后再给出答案,不要急于下结论; 可以让 Claude 先逐字写下自己的思考,放在 tag 中,该 tag 是私人所有的,不对用户展示出来。也就是人为创建一个思考空间。

  8. 使用思维链,让我们一步步思考,但不要把该提示词放在同一个主 prompt 中,例:

Human: 如何把大象放到冰箱里?   
Assistant: 我能一步步思考吗?   
Human: 当然可以,请吧。   
Assistant:  
  1. 把复杂任务分解为简单任务(如果可以),不要把所有的指令放在同一段,最好以 1. 2. 3. 4. 分点列出;

  2. 承接 5,事实上可以把 Claude 输出的任意结果再作为信息补充到 promt 的背景信息中;该技术被称为提示链;

  3. 要求 Claude 确认自己的指令是否被正确理解。如果 Claude 回复已被正确理解,可以把 Claude 的回复作为背景信息补充到自己的 prompt 中;

  4. 不要给 Claude 下达错误的指令,例如让其重写一段不存在的文本;


本文参考:

  1. Learn Prompting
  2. ChatGPT Prompt Engineering for Developers
  3. Introduction to prompt engineering
  4. Prompt Engineering Guide